//
//  LWStatusListViewModel.swift
//  Swift_Weibo_HLW
//
//  Created by huanglinwang on 16/9/23.
//  Copyright © 2016年 Linwang. All rights reserved.
//

import UIKit
import SDWebImage
//封装首页微博数据网络请求 -> 首页的tabViewCell
class LWStatusListViewModel: NSObject {
    //  关注用户的微博数据源
    lazy var statusList: [LWStatusViewModel] = [LWStatusViewModel]()
    //加载微博首页数据
    func loadData(isPullup: Bool, callBack: @escaping (Bool, String)->()) {
        //获取accessToken
        let accessToken = LWUserAccountViewModel.sharedUserAccoutnViewModel.accessToken!
        //  获取上拉加载请求需要的微博id
        var maxId: Int64 = 0
        //  获取下拉属性请求需要的微博id
        var sinceId: Int64 = 0
        // 上拉和下拉id值的逻辑处理
        if isPullup {
            //  上拉加载
            maxId = statusList.last?.status?.id ?? 0
            //  解决数据重复问题, 需要让其微博id减去1
            if maxId > 0 {
                maxId -= 1
            }
        } else {
            //  下拉刷新
            sinceId = statusList.first?.status?.id ?? 0
        }
        var message: String = "没有加载到最新微博数据"

        //网络请求数据
        LWNetworkTools.sharedTools.requestStatuses(accessToken: accessToken, maxId: maxId, sinceId:sinceId) { (response, error) in
            if error != nil{
                print(error)
                callBack(false, message)

                return
            }
            //请求成功
            guard let dict = response as? [String: Any] else{
                print("不是字典")
                callBack(false, message)

                return
            }
            //这是一个数组字典 -> 需要加两个中括号
            guard let statusArray = dict["statuses"] as? [[String : Any]] else{
                print("不是字典")
                callBack(false, message)
                return
            }
            //YYModel 提供的
            let statusArr = NSArray.yy_modelArray(with: LWStatus.self, json: statusArray) as! [LWStatus]
            var tempArray = [LWStatusViewModel]()
            
            //  判断服务器返回的数据个数是否大于0
            if tempArray.count > 0 {
                message = "加载了\(tempArray.count)条微博数据"
            }

            //  创建调度组
            let group = DispatchGroup()
            //遍历模型数组
            for status in statusArr{
                let viewModel  = LWStatusViewModel(status: status)
                tempArray.append(viewModel)
                if status.pic_urls?.count == 1{
                    if let url = status.pic_urls?.first?.thumbnail_pic{
                        group.enter()
                        SDWebImageManager.shared().downloadImage(with: URL(string: url), options: [], progress: nil, completed: { (image, error, _, _ , url) in
                            group.leave()
                        })
                    }
                }
                if status.retweeted_status?.pic_urls?.count == 1 {
                    if let url = status.retweeted_status?.pic_urls?.first?.thumbnail_pic {
                            group.enter()
                        SDWebImageManager.shared().downloadImage(with: URL(string: url), options: [], progress: nil, completed: { (image, error , _ , _ , url ) in
                            group.leave()
                        })
                    }
                }
            }
            //判断是上拉还是下拉
            if isPullup {
                //  如果上拉加载需要把数据追加到原始数组后面
                self.statusList.append(contentsOf: tempArray)
            } else {
                //  下拉刷新
                self.statusList.insert(contentsOf: tempArray, at: 0)
            }
            //调度组执行完成通知
            group.notify(queue: DispatchQueue.main, execute:{
                    DispatchQueue.main.asyncAfter(wallDeadline: DispatchWallTime.now() + 2, execute: { 
                        callBack(true, message)
                    })
            })
        }
    }
}
